home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
The World of Computer Software.iso
/
vsc92nov.zip
/
Number.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-11-02
|
2KB
|
104 lines
/*
* Number.c -- Implementation of generic Scheme numbers
*
* (C) m.b (Matthias Blume), Mon May 11 13:02:00 MET DST 1992, HUB/Ger
* Humboldt-University of Berlin, Germany
*/
# ident "@(#)Number.c (C) M.Blume, Humboldt-Uni Berlin, 1.2"
# include "storext.h"
# include "Number.h"
# include "Fixnum.h"
# include "identifier.h"
# include "Cont.h"
# include "type.h"
# include "except.h"
static
void apply_to_subs (void *vnumber, applied_proc proc, void *cd)
{
ScmNumber *number = vnumber;
(* proc) ((void *)&number->value, cd);
}
static
void display (void *vnumber, putc_proc pp, void *cd)
{
display_object (((ScmNumber *) vnumber)->value, pp, cd);
}
static
void write_this (void *vnumber, putc_proc pp, void *cd)
{
write_object (((ScmNumber *) vnumber)->value, pp, cd);
}
static
int equal (void *vself, void *vother)
{
if (ScmTypeOf (vother) != ScmTypeOf (vself))
return 0;
else
return equal_object (
((ScmNumber *) vself)->value,
((ScmNumber *) vother)->value);
}
static
struct scheme_od_extension ext = {
display, write_this,
equal, equal,
};
OD_VECTOR (ScmExactNumber_od_vector,
sizeof (ScmNumber),
NULL,
apply_to_subs,
EXACT_NUMBER_IDENTIFIER,
NULL, NULL, NULL,
NULL, NULL, NULL,
&ext
);
OD_VECTOR (ScmInexactNumber_od_vector,
sizeof (ScmNumber),
NULL,
apply_to_subs,
INEXACT_NUMBER_IDENTIFIER,
NULL, NULL, NULL,
NULL, NULL, NULL,
&ext
);
long ScmNumberToInt (void *vnumber)
{
ScmNumber *number;
long res;
int valid;
if (ScmTypeOf (vnumber) != ScmType (ExactNumber))
error ("ScmNumberToInt requires exact numbers: %w", vnumber);
number = vnumber;
res = ScmNRT_get_long (number->value, &valid);
if (valid)
return res;
else
error ("bad argument to ScmNumberToInt: %w", vnumber);
/*NOTREACHED*/
}
ScmNumber *ScmIntToExactNumber (long x)
{
ScmNumber *res;
void *fix;
fix = ScmLong2Fixnum (x);
ScmPush (fix);
res = new (ScmType (ExactNumber));
res->value = ScmPop ();
return res;
}